import 'package:dio/dio.dart';

import '../public.dart';

/// 分页数据状态管理类
class PageState<T> {
  /// 所有页面的数据列表
  final List<List<T>> list;

  /// 下拉刷新中
  final bool refreshing;

  /// 上拉加载更多中
  final bool loading;

  /// 是否还有更多数据可以加载
  final bool hasMore;

  /// 错误信息（null表示没有错误）
  final String? error;

  const PageState({
    this.list = const [],
    this.refreshing = false,
    this.loading = false,
    this.hasMore = true,
    this.error,
  });

  /// 合并后的所有数据项
  List<T> get items => list.expand((e) => e).toList();

  /// 数据总数量
  int get totalCount => items.length;

  /// 是否为初始加载错误（首次加载失败）
  bool get isInitialError =>
      error != null && list.isEmpty && !refreshing && !loading;

  /// 是否为空数据状态（无错误、无数据、且不在加载）
  bool get isEmpty => list.isEmpty && error == null && !refreshing && !loading;

  /// 是否正在加载任何数据（下拉刷新或上拉加载）
  bool get isLoading => refreshing || loading;

  /// 是否有错误
  bool get hasError => error != null;

  /// 是否可以加载更多（满足条件：没有错误、当前没在加载、还有更多数据）
  bool get canLoadMore => !hasError && !isLoading && hasMore;

  /// 当前页面索引（从0开始）
  int get currentPage => list.length;

  /// 下一页页码（从1开始）
  int get nextPage => currentPage + 1;
}

/// PageState 的辅助扩展方法
extension _Copy<R> on PageState<R> {
  /// 创建新的PageState实例
  PageState<R> copyWith({
    List<List<R>>? list,
    bool? refreshing,
    bool? loading,
    bool? hasMore,
    String? error,
  }) => PageState<R>(
    list: list ?? this.list,
    refreshing: refreshing ?? this.refreshing,
    loading: loading ?? this.loading,
    hasMore: hasMore ?? this.hasMore,
    error: error ?? this.error,
  );
}

/// 分页数据仓库，处理上拉加载和下拉刷新
class ListRepository<R> with ChangeNotifier {
  /// 默认每页数据量
  final int pageSize;

  /// 当前状态
  PageState<R> _state = const PageState();

  /// 获取当前状态
  PageState<R> get state => _state;

  /// 请求函数：返回指定页码的数据
  final Future<List<R>> Function(int page, int pageSize) request;

  /// 构造函数
  ListRepository({this.pageSize = 20, required this.request});

  /// 下拉刷新：重新加载第一页数据
  Future<void> refresh(bool? isFirst) async {
    // 如果正在刷新，则不执行
    if (_state.refreshing) return;

    // 设置刷新状态
    _state = _state.copyWith(
      refreshing: true,
      loading: false,
      hasMore: true,
      list: isFirst == true ? [] : _state.list,
      error: null,
    );
    notifyListeners();

    try {
      // 请求第一页数据
      final list = await request(1, pageSize);

      // 更新状态：数据、是否有更多
      _state = _state.copyWith(
        list: [list],
        hasMore: list.length == pageSize,
        refreshing: false,
        error: null,
      );
    } on DioException catch (e) {
      // 网络错误
      _state = _state.copyWith(error: e.message, refreshing: false);
    } catch (e) {
      // 其他错误
      _state = _state.copyWith(error: e.toString(), refreshing: false);
    } finally {
      notifyListeners();
    }
  }

  /// 上拉加载更多：加载下一页数据
  Future<void> loadMore() async {
    // 检查是否可以加载更多
    if (!_state.canLoadMore) return;

    // 设置加载状态
    _state = _state.copyWith(loading: true);
    notifyListeners();

    try {
      // 计算下一页的页码（从1开始）
      final nextPageNum = _state.nextPage;

      // 请求下一页数据
      final list = await request(nextPageNum, pageSize);

      // 判断是否还有更多数据
      final hasMoreData = list.length == pageSize;

      // 更新状态：添加新数据、更新hasMore
      _state = _state.copyWith(
        list: [..._state.list, list],
        hasMore: hasMoreData,
        loading: false,
        error: null,
      );
    } catch (e) {
      // 加载失败，设置错误信息但不改变现有数据
      _state = _state.copyWith(error: e.toString(), loading: false);
    } finally {
      notifyListeners();
    }
  }

  /// 清除所有数据并重置状态
  void clear() {
    _state = const PageState();
    notifyListeners();
  }

  /// 手动设置错误状态
  void setError(String error) {
    _state = _state.copyWith(error: error);
    notifyListeners();
  }

  /// 手动清除错误
  void clearError() {
    _state = _state.copyWith(error: null);
    notifyListeners();
  }
}
